﻿/**
 * @file guild_members_logic.h
 * @date 2021/04/14 21:09
 *
 * @author harrybao (harrybao@123u.com)
 *
 * @brief 公会成员模块逻辑
 *
 * @version v1.0.0
 *
 * @copyright Copyright © 2021 All Rights Reserved 上海欢乐互娱网络科技有限公司
 *
 * @par history:
 * <table>
 * <tr><th>Date                     <th>Version     <th>Author <th>Description
 * <tr><td>2021/04/14 21:09         <td>1.0.0       <td>harrybao
 * <td>创建初始版本
 * </table>
 */

// #ifndef GUILD_MEMBERS_LOGIC_H
// #define GUILD_MEMBERS_LOGIC_H

#pragma once

#include <functional>
#include <string>

#include "error/error_code.h"
#include "guild/guild.h"
#include "guild/module/guild_module.h"
#include "guild/module/guild_module_loader.hpp"

namespace guild_service {

/**
 * @brief 公会成员模块逻辑类
 *
 */
class GuildMembersLogic {
 public:
  using duty_type = guildservicebasic_cpp::GuildDuty;  ///< 公会成员职责类型
 public:
  /**
   * @brief Get the Guild Members object
   * 
   * @param guild_id 
   * @param module_members 
   * @return true 
   * @return false 
   */
  static bool GetModuleMembers(const guild_id_type guild_id,
                              GuildModuleMembers &module_members);
  /**
   * @brief Get the Guild Member object
   * 
   * @param role_uuid 
   * @param member 
   * @return true 
   * @return false 
   */
  static bool GetGuildMember(const role_uuid_type role_uuid,
                             GuildMember &member);

 public:
  /**
   * @brief 踢出公会成员
   *
   * @param role_uuid
   * @param kick_role_uuid
   * @param ec
   * @return true
   * @return false
   */
  static bool KickOutGuildMember(const role_uuid_type role_uuid,
                                 const role_uuid_type kick_role_uuid,
                                 error_code &ec);

  /**
   * @brief 退出公会
   *
   * @param role_uuid
   * @param guild_id
   * @param member_left_count
   * @param ec 错误码
   * @return true
   * @return false
   */
  static bool QuitMember(const role_uuid_type role_uuid,
                         guild_id_type &guild_id, uint32_t &member_left_count,
                         error_code &ec);

  /**
   * @brief 获取公会成员职责
   *
   * @param role_uuid 角色唯一id
   * @return const duty_type 职责类型
   */
  static const duty_type GetMemberDuty(const role_uuid_type role_uuid);

  /**
   * @brief 检查公会成员职责
   *
   * @param role_uuid 角色唯一id
   * @param duty 公会职责
   * @return true 具备职责
   * @return false 不具备职责
   */
  static bool CheckMemberDuty(const role_uuid_type role_uuid,
                              const duty_type duty);

  /**
   * @brief 检查公会成员职责
   *
   * 满足其一就返回true
   * @param role_uuid 角色唯一id
   * @param duty_list 公会职责列表
   * @return true 具备职责
   * @return false 不具备职责
   */
  static bool CheckMemberDuty(const role_uuid_type role_uuid,
                              std::vector<duty_type> &duty_list);

  /**
   * @brief 公会成员职责人数是否已满
   *
   * @param guild_id
   * @param duty
   * @return true
   * @return false
   */
  static bool IsMemberDutyFull(const guild_id_type guild_id,
                               const duty_type duty);

  /**
   * @brief 设置公会成员
   * @param role_uuid 
   * @param member_role_uuid 
   * @param duty 
   * @param ec 
   * @return
   */
  static bool SetMemberDuty(const role_uuid_type role_uuid,
                                 const role_uuid_type member_role_uuid,
                                 const duty_type duty, error_code &ec);
 public:
  /**
   * @brief 获取公会成员总人数
   *
   * @param guild_id_type 公会id
   * @return std::size_t 总人数
   */
  static std::size_t GetMembersCount(const guild_id_type guild_id);

  /**
   * @brief 获取公会成员在线人数
   *
   * @param guild_id 公会id
   * @return std::size_t 在线人数
   */
  static std::size_t GetMembersCountOnline(const guild_id_type guild_id);

  /**
   * @brief 公会成员人数是否已满
   *
   * @param guild_id 公会id
   * @return true 人数已满
   * @return false 人数未满
   */
  static bool IsMemberFull(const guild_id_type guild_id);

  /**
   * @brief 公会成员是否存在
   *
   * @param guild_id 公会id
   * @param role_uuid 角色唯一id
   * @return true 公会成员存在
   * @return false 公会成员不存在
   */
  static bool IsMemberExist(const guild_id_type guild_id,
                            const role_uuid_type role_uuid);

  /**
   * @brief 添加公会成员
   *
   * @param guild_id 公会id
   * @param role_uuid 角色唯一id
   * @param ec 错误码
   * @return true 添加成功
   * @return false 添加失败
   */
  static bool AddGuildMember(const guild_id_type guild_id,
                             const role_uuid_type role_uuid, error_code &ec);

  using ForeachMemberCallbackType =
      std::function<void(const GuildMember &)>;  ///< 遍历公会成员回调函数类型

  /**
   * @brief 遍历公会成员
   *
   * @param guild_id 公会id
   * @param callback 遍历公会成员回调函数
   */
  static void ForeachMember(
      const guild_id_type guild_id,
      const GuildMembersLogic::ForeachMemberCallbackType &callback);

 private:
  /**
   * @brief 公会成员职责人数是否已满
   *
   * @param module_members
   * @param duty
   * @return true
   * @return false
   */
  static bool IsMemberDutyFull(const GuildModuleMembers module_members,
                               const duty_type duty);

  /**
   * @brief 移除公会角色
   *
   * @param guild_id 公会id
   * @param role_uuid 角色唯一id
   * @return true 移除成功
   * @return false 移除失败
   */
  static bool RemoveGuildRole(const guild_id_type guild_id,
                              const role_uuid_type role_uuid);
};

}  // namespace guild_service

// #endif  // GUILD_MEMBERS_LOGIC_H